package leetcode.top100;

/**
 *  在行列都排好序的矩阵中找数
 *      【题目】 给定一个有N*M的整型矩阵matrix和一个整数K，
 *             matrix的每一行和每一 列都是排好序的【假设从小到大】。 实现一个函数，
 *             判断K是否在matrix中。
 *     【要求】 时间复杂度为O(N+M)， 额外空间复杂度为O(1)
 *         分析：遍历肯定不行，运用数据状况，因为行和列都是排好序的，那么从这个条件出发
 *         方式1: 从最后一列第一个数开始，若这个数大于target，那么直接往前移动一列，
 *                 否则开始遍历该列，在遍历过程中，如果遇到元素比target大，
 *                 那么直接往前移动列【行不变，不用归0，画图】
 *         方式2：从最后一行的第一个数开始，道理同方式1
 * @date 2020/2/27 23:21
 */
public class Code240_FindMaxOrMinInMatrix {
    public static void main(String[] args) {
        int[][] matrix = new int[][] { { 0, 1, 2, 3, 4, 5, 6 },// 0
                { 10, 12, 13, 15, 16, 17, 18 },// 1
                { 23, 24, 25, 26, 27, 28, 29 },// 2
                { 44, 45, 46, 47, 48, 49, 50 },// 3
                { 65, 66, 67, 68, 69, 70, 71 },// 4
                { 96, 97, 98, 99, 100, 111, 122 },// 5
                { 166, 176, 186, 187, 190, 195, 200 },// 6
                { 233, 243, 321, 341, 356, 370, 380 } // 7
        };
        int K = 234;
        System.out.println(isExist(matrix, K));
    }

    /**
     * 行和列都是从小到大。从左下角或右上角入手
     */
    public static boolean isExist(int [][]m,int target){
        int row = m.length -1;
        int col = m[0].length - 1;
        int curRow = 0;
        int curCol = col;
        while (curRow <= row && curCol >=0){
            if(target < m[curRow][curCol]){
                curCol --;
            }else if(target > m[curRow][curCol]){
                curRow ++;
            }else {
                return true;
            }
        }
        return false;

    }
    /**
     * 行和列都是从大到小，也是从左下角或右上角入手
     */
    public static boolean isExist1(int [][]m,int target){
        int row = m.length -1;
        int col = m[0].length - 1;
        int curRow = 0;
        int curCol = col;
        while (curRow <= row && curCol >=0){
            if(target > m[curRow][curCol]){
                curCol --;
            }else if(target < m[curRow][curCol]){
                curRow ++;
            }else {
                return true;
            }
        }
        return false;
    }


}
